// 双击进入编辑状态并保存类
define([
	"publicBusiness/layerPc",
	"publicBusiness/verifyPermission",
], function (layerPc, Permission) {
	// 双击编辑(原地)类封装
	var TableDoubleClickEdit = function(opt){
		this.init(opt);
		// 编辑操作按钮绑定事件
		this.bindCtrlBtnEvent();
		// 可编辑元素双击事件绑定
		this.bindEleClickEvent();
		// 可编辑元素blur事件绑定--跟产品沟通暂时先不加此效果
		// this.bindEleBlurEvent();
		// 可编辑元素focus事件绑定
		this.bindEleFocusEvent();
	}

	/**
	 * [init 初始化方法]
	 * @param  {[object]} opt [配置参数对象]
	 * @return {[type]}     [description]
	 */
	TableDoubleClickEdit.prototype.init = function(opt){
		var defaults = {
			delegate_ele: ".double_click_edit", //事件代理对象

			edit_ele: "[data-click-edit='true']", //被编辑的对象
			edit_ele_select_attr: "data-select-value",  //被编辑的对象(如果对应的表单元素是select框，则存储select选中的值)
			edit_ele_form: "[data-click-edit-form='form']", //被编辑的对象对应的表单元素(input,select等)
			edit_ele_form_hide_class: "hide", //被编辑的对象对应的表单元素-隐藏状态对应的class
			edit_ele_form_init_class: "edit_input", //被编辑的对象对应的表单元素-初始状态对应的class
			edit_btn: "[data-click-edit-btn='edit_btn']", //编辑取消编辑操作按钮
			edit_btn_txt_normal: "【编辑】", //编辑取消编辑操作按钮-正常文本
			edit_btn_txt_cancel: "【保存】", //编辑取消编辑操作按钮-取消文本
			edit_btn_edit_class: "editable", //编辑取消编辑操作按钮-编辑状态对应的class

			requst_url: "/nianbunianji/edit", //保存请求url地址
			requst_data: {}, //请求url地址-所传的条件
			requst_data_call: "", //请求url地址-拼装所传的条件回调函数
			requst_tip_name: "code_user_msg", //请求url地址失败后的错误提示对应的字段

			save_btn_call: "", //保存按钮回调函数-可以保存数据时才会触发

			isVerifyPermission: true, //是否验证操作权限
			verifyIdentification: "" //权限验证标识
		}
		// 获得最终的配置对象
		this.config = $.extend(true, defaults, opt);
		// 基础配置属性
		this.requst_data = this.config.data; //请求接口传送的对象
		this.form_val = null; //当前修改元素对应的值
	}

	/**
	 * [bindCtrlBtnEvent 编辑操作按钮绑定事件]
	 * @return {[type]} [description]
	 */
	TableDoubleClickEdit.prototype.bindCtrlBtnEvent = function(){
		var _this = this;

		$(this.config.delegate_ele).on("click", this.config.edit_btn, function(){
			// 验证操作权限
			if(_this.config.isVerifyPermission){
				if( !Permission.verifyPermission(_this.config.verifyIdentification) ){
					return;
				}
			}
			// 元素显示隐藏
			if( $(this).hasClass( _this.config.edit_btn_edit_class ) ){ //编辑状态-回归正常状态
				// 发起异步请求
				var oParentTr = $(this).parents("tr");
				if( _this.isSaveData( $(this) ) ){
					// 回调函数参数
					// 参数一 插件对象本身									参数二 发生事件的表格当前行对象
					// 参数三 发生事件的表格当前行对象对应的可编辑对象元素	参数四 发生事件按钮本身
					_this.config.save_btn_call && _this.config.save_btn_call( _this, oParentTr, _this.getFormEle( $(this) ), $(this) );
				}else{
					_this.showHideFormEle(oParentTr);
					_this.changeEditBtnStatus( $(this) );
				}
			}else{
				$(this).parents("tr").find(_this.config.edit_ele).hide();
				$(this).parents("tr").find(_this.config.edit_ele_form).removeClass(_this.config.edit_ele_form_hide_class);
				// 操作按钮状态改变
				_this.changeEditBtnStatus( $(this) );
			}
			
		});
	}

	/**
	 * [showHideFormEle 请求数据 可编辑表单元素显示隐藏]
	 * @param  {[jquery object]} parentTr [当前行元素]
	 * @return {[type]}          [description]
	 */
	TableDoubleClickEdit.prototype.showHideFormEle = function(parentTr){
		parentTr.find(this.config.edit_ele).show();
		parentTr.find(this.config.edit_ele_form).addClass(this.config.edit_ele_form_hide_class);
	}

	/**
	 * [bindEleClickEvent 可编辑元素双击事件绑定-双击元素隐藏对应的表单元素显示]
	 * @return {[type]} [description]
	 */
	TableDoubleClickEdit.prototype.bindEleClickEvent = function(){
		var _this = this;

		$(this.config.delegate_ele).on("dblclick", this.config.edit_ele, function(){
			var oEditBtn = $(this).parents("tr").find( _this.config.edit_btn ); //操作按钮对象
			// // 元素显示隐藏
			// _this.showHideEle( $(this) );
			// // 操作按钮状态改变
			// _this.changeEditBtnStatus(oEditBtn);
			// 验证操作权限
			if(_this.config.isVerifyPermission){
				if( !Permission.verifyPermission(_this.config.verifyIdentification) ){
					return;
				}
			}
			if( !_this.getEditableNum( $(this) ) ){
				oEditBtn.click();
				var oSlib = $(this).siblings(_this.config.edit_ele_form); //发生事件元素的相邻表单元素
				oSlib.focus();

				if( oSlib.get(0).tagName == "INPUT" ){ //如果是input元素
					var sVal = $(this).html();
					oSlib.val("");
					oSlib.val(sVal);
				}
			}else{
				_this.showHideEle( $(this) );
			}
		});
	}

	/**
	 * [bindEleFocusEvent 可编辑元素获得焦点事件]
	 * @return {[type]} [description]
	 */
	TableDoubleClickEdit.prototype.bindEleFocusEvent = function(){
		var _this = this;

		$(this.config.delegate_ele).on("focus", this.config.edit_ele_form, function(){
			_this.form_val = $(this).val();
		});
	}

	/**
	 * [bindEleBlurEvent 可编辑元素blur事件绑定-双击元素显示对应的表单元素隐藏]--跟产品沟通暂时先不加此效果
	 * @return {[type]} [description]
	 */
	TableDoubleClickEdit.prototype.bindEleBlurEvent = function(){
		var _this = this;

		$(this.config.delegate_ele).on("blur", this.config.edit_ele_form, function(){
			var that = $(this);
			var oEditBtn = $(this).parents("tr").find( _this.config.edit_btn ); //操作按钮对象
			// 判断如果单独行多余一个可编辑的元素即不进行保存
			if( !_this.isBlurSave(that) ){
				return;
			}
			var sVal = $(this).val();
			var oEdit = $(this).siblings(_this.config.edit_ele); //表单值存储对象
			var oParTr = $(this).parents("tr"); //当前行tr对象
			var iIdx = $(this).parents("tr").find("td").index( $(this).parent() ); //获取当前td对应的索引
			var sFormEleType = $(this).get(0).tagName; //发生事件元素的标签类型

			// 为空验证
			if(!sVal){
				layerPc.msg({
				    define_type: 1,
				    contents: $(this).parents(_this.config.delegate_ele).find("th").eq(iIdx).html() + "不能为空",
				    call: function(){
				    	that.focus();
				    }
				});
			}else{
				if(sVal != _this.form_val){
					// 请求接口保存编辑后的数据
					$.post(_this.config.requst_url, oParTr.find("input."+ _this.config.edit_ele_form_init_class +",select."+ _this.config.edit_ele_form_init_class).serializeArray(), function(data){
						if(data.status){
							// 赋值
							if( sFormEleType == "SELECT" ){
								oEdit.html( that.find("option:selected").html() );
								oEdit.attr(_this.config.edit_ele_select_attr, sVal);
							}else{
								oEdit.html(sVal);
							}
							layerPc.msg({
		                        offset: "160px",
		                        define_type: 0, //弹窗状态 0-成功 1-失败
		                        contents: "保存成功"
		                    })

		                    // 元素显示隐藏
		                    _this.showHideEle( that );
		                    // 操作按钮状态改变
		                    if( !_this.getEditableNum( that ) ){
		                    	_this.changeEditBtnStatus(oEditBtn);
		                    }
						}else{
							layerPc.msg({
		                        offset: "160px",
		                        define_type: 1, //弹窗状态 0-成功 1-失败
		                        contents: data[_this.config.requst_tip_name]
		                    })
		                    // 还原为原来的值
		                    if( sFormEleType == "SELECT" ){
		                    	that.find("option[value="+ oEdit.attr(_this.config.edit_ele_select_attr) +"]").prop("selected", true);
		                    }else{
		                    	that.val( oEdit.html() );
		                    }
						}
					}, "json");
				}else{
					// 元素显示隐藏
					_this.showHideEle( that );
					// 操作按钮状态改变
					if( !_this.getEditableNum( that ) ){
						_this.changeEditBtnStatus(oEditBtn);
					}
				}
			}

		});
	}

	/**
	 * [showHideEle 名称和表单元素显示隐藏交互]
	 * @param  {[jquery object]} _this [当前发生事件的元素]
	 * @return {[type]}       [description]
	 */
	TableDoubleClickEdit.prototype.showHideEle = function(_this){
		if( _this.get(0).tagName == "INPUT" || _this.get(0).tagName == "SELECT" ){ //如果是form表单元素
			if( _this.hasClass(this.config.edit_ele_form_hide_class) ){ //当前是隐藏状态
				_this.removeClass(this.config.edit_ele_form_hide_class);
				_this.siblings(this.config.edit_ele).hide();
			}else{
				_this.addClass(this.config.edit_ele_form_hide_class);
				_this.siblings(this.config.edit_ele).show();
			}
		}else{
			var oSlib = _this.siblings(this.config.edit_ele_form); //发生事件元素的相邻表单元素
			if( oSlib.hasClass(this.config.edit_ele_form_hide_class) ){ //当前是隐藏状态
				oSlib.removeClass(this.config.edit_ele_form_hide_class);
				_this.hide();
				// oSlib.focus();
			}else{
				oSlib.addClass(this.config.edit_ele_form_hide_class);
				_this.show();
			}
		}
	}

	/**
	 * [changeEditBtnStatus 编辑按钮状态改变]
	 * @param  {[jquery object]} _this [操作按钮本身]
	 * @return {[type]} [description]
	 */
	TableDoubleClickEdit.prototype.changeEditBtnStatus = function(_this){
		if( _this.hasClass( this.config.edit_btn_edit_class ) ){ //编辑状态
			_this.removeClass( this.config.edit_btn_edit_class );
			_this.html( this.config.edit_btn_txt_normal );
		}else{
			_this.addClass( this.config.edit_btn_edit_class );
			_this.html( this.config.edit_btn_txt_cancel );
		}
	}

	/**
	 * [getEditableNum 获取可编辑元素编辑状态的个数]
	 * @param  {[jquery object]} _this [发生事件的元素]
	 * @return {[number]}       [description]
	 */
	TableDoubleClickEdit.prototype.getEditableNum = function(_this){
		return _this.parents("tr").find(this.config.edit_ele_form + "[class='"+ this.config.edit_ele_form_init_class +"']").length;
	}

	/**
	 * [isBlurSave 判断是否进行失去焦点保存（判断条件是每一条数据可双击编辑元素的个数 ==1 才进行保存）]
	 * @param  {[jquery object]} _this [发生事件的元素]
	 * @return {[boolean]}       [true -> 保存 false -> 不保存]
	 */
	TableDoubleClickEdit.prototype.isBlurSave = function (_this) {
		var iLen = _this.parents("tr").find(this.config.edit_ele_form).length;; //获取可编辑表单元素的个数
		var bBoo = (iLen == 1) ? true : false;
		return bBoo;
	}

	/**
	 * [isSaveData 判断是否保存数据]
	 * @param  {[jquery object]}  _this [发生事件的jquery对象]
	 * @return {Boolean}       [true -> 保存 false -> 不保存]
	 */
	TableDoubleClickEdit.prototype.isSaveData = function (__this) {
		var _this = this;
		var oParentTr = __this.parents("tr");
		var aFormEle = oParentTr.find(this.config.edit_ele_form);
		var bBoo = false;
		aFormEle.each(function(idx, el) {
			var oSlib = $(this).siblings(_this.config.edit_ele); //获取表单元素相邻元素
			if( $(this).get(0).tagName == "INPUT" ){ //如果是input元素
				if( $(this).val() != oSlib.html() ){
					bBoo = true;
					return false;
				}
			}else{
				if( $(this).find("option:selected").html() != oSlib.html() ){
					bBoo = true;
					return false;
				}
			}
		});
		return bBoo;
	}

	/**
	 * [getFormEle 获取编辑行下可编辑元素表单元素的集合]
	 * @param  {[jquery object]}  _this [发生事件的jquery对象]
	 * @return {[jquery array]}       [返回元素集合 jquery数组]
	 */
	TableDoubleClickEdit.prototype.getFormEle = function (_this) {
		var oParentTr = _this.parents("tr");
		var aFormEle = oParentTr.find(this.config.edit_ele_form);
		return aFormEle;
	}

	/**
	 * [getFormValue 获取编辑行的表单对象]
	 * @param  {[jquery object]} parentTr [当前编辑行元素]
	 * @return {[object]}          [表单对象]
	 */
	TableDoubleClickEdit.prototype.getFormValue = function (parentTr) {
		return parentTr.find("input."+ this.config.edit_ele_form_init_class +",select."+ this.config.edit_ele_form_init_class).serializeArray();
	}

	return TableDoubleClickEdit;
})